"""
GPIO协议模块

该模块实现了GPIO通信的底层协议。
"""

import pigpio
import logging
from typing import List, Optional
from .base_protocol import BaseProtocol


class GPIOProtocol(BaseProtocol):
    """GPIO协议类"""

    def __init__(
        self, rx_pin: int = 17, tx_pin: int = 27, log_level: int = logging.INFO
    ):
        """
        初始化GPIO协议

        Args:
            rx_pin: RX引脚号
            tx_pin: TX引脚号
            log_level: 日志级别
        """
        super().__init__(log_level)
        self.rx_pin = rx_pin
        self.tx_pin = tx_pin
        self.pi: Optional[pigpio.pi] = None
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(log_level)  # 设置当前模块的日志级别

    def connect(self) -> bool:
        """
        建立GPIO连接

        Returns:
            bool: 连接是否成功
        """
        try:
            self.pi = pigpio.pi()
            if not self.pi.connected:
                self.logger.error("无法连接到pigpio守护进程")
                return False

            self.logger.info("成功连接到pigpio守护进程")
            self._init_gpio()
            return True
        except Exception as e:
            self.logger.error(f"初始化GPIO时出错: {e}")
            return False

    def disconnect(self) -> None:
        """断开GPIO连接"""
        pass
        # if self.pi is not None:
        #     try:
        #         self.pi.stop()
        #         self.logger.info("成功关闭GPIO连接")
        #     except Exception as e:
        #         self.logger.error(f"关闭GPIO连接时出错: {e}")

    def _init_gpio(self) -> None:
        """初始化GPIO引脚"""
        self.pi.set_mode(self.rx_pin, pigpio.OUTPUT)
        self.pi.write(self.rx_pin, 0)
        self.pi.set_mode(self.tx_pin, pigpio.OUTPUT)
        self.pi.write(self.tx_pin, 1)

    def port_write(self) -> None:
        """配置单线串口为输出"""
        self.pi.write(self.tx_pin, 1)
        self.pi.write(self.rx_pin, 0)

    def port_read(self) -> None:
        """配置单线串口为输入"""
        self.pi.write(self.rx_pin, 1)
        self.pi.write(self.tx_pin, 0)

    def port_reset(self) -> None:
        """重置GPIO状态"""
        self.pi.write(self.rx_pin, 1)
        self.pi.write(self.tx_pin, 1)

    def write_command(
        self,
        device_id: int,
        cmd: int,
        data: List[int],
        retry_count: int = 1,
    ) -> bool:
        """
        发送命令（GPIO协议不需要实现此方法）

        Args:
            device_id: 设备ID
            cmd: 命令类型
            data: 数据列表
            retry_count: 重试次数

        Returns:
            bool: 命令是否发送成功
        """
        return True

    def read_command(self, device_id: int, cmd: int, retry_count: int = 1) -> bool:
        """
        发送读取命令（GPIO协议不需要实现此方法）

        Args:
            device_id: 设备ID
            cmd: 命令类型
            retry_count: 重试次数

        Returns:
            bool: 命令是否发送成功
        """
        return True

    def get_response(self, cmd: int, timeout: float = 0.1) -> Optional[int]:
        """
        获取响应数据（GPIO协议不需要实现此方法）

        Args:
            cmd: 命令类型
            timeout: 超时时间(秒)

        Returns:
            响应数据，如果读取失败则返回None
        """
        return None
